perm filename NEWX.FAI[TMP,LCS] blob
sn#121880 filedate 1974-10-22 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00011 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE X
C00003 00003 RPG MODE:
C00006 00004 NORPG: SETZM RPGMOD# TELL WORLD THAT SOME POOR LOSER IS RUNNING US MANUALLY
C00010 00005 YDEF: ADD A,B ADD SLICE OFFSET TO ORIGIN OFFSET
C00014 00006 DOIT: ANDCM C,BITTAB(D) MASK OUT BIT FOUND BY JFFO
C00017 00007 XINI: SKIPE RPGMOD
C00023 00008 XGPOUT: SKIPGE XGSFLG
C00026 00009 FNF: PUSHJ P,DETCHK COULDN'T FIND THE FILE
C00030 00010 GETNAM: MOVEI A,
C00031 00011 FILNAM: 0
C00032 ENDMK
C⊗;
TITLE X
A←1
B←2
C←3
D←4
E←5
L←6
U←7
PEN←10
X←11
Y←12
XD←13
T←15
TT←16
P←17
LPDL←←69 ;OBSCENE PDL
DSK←←1
XGP←←2
LMAR←←=0
RMAR←←=1699 ;WE USE THE FULL SCAN WIDTH
WIDTH←←RMAR-LMAR+1
LBUFL←←<WIDTH+43>/44 ;LBUFL WORDS x 36 BITS/WORD ≥ # BITS IN LINE
LSTBIT←←1⊗<LBUFL*44-WIDTH> ;POSITION OF LAST BIT IN LAST WORD OF EACH LBUF
OVERLAP←←=50 ;OVERLAP 1/4 INCH
BOTTOM←←=50 ;SHIFT BOTTOM UP 1/4 INCH
NBUFS←←4
EXTERN JOBREL,JOBFF
MAILBF: BLOCK 40
SIGN: 0 ;GLOBAL VARIABLE FOR RNUM TO INDICATE SCANNING OF A MINUS SIGN
LINE: 0 ;NUMBER OF TTY WHERE MESSAGES ARE SENT
PNTR: 0
;RPG MODE:
;REGISTER CONTENTS
; 0 FILENAME
; 1 FILEXT,,SPOOL FLAG
; 2 FILPPN
; 3 MAX X,,MIN X IN PLOTTER STEPS ALONG PAPER
; 4 MAX Y,,MIN Y IN PLOTTER STEPS ACROSS PAPER
; 5 GETLIN DONE FROM PLOT PROG
COMMENT ⊗
EXTERNAL X AXIS BECOMES INTERNAL Y AXIS, + ALONG THE DIRECTION OF PAPER MOTION
EXTERNAL Y AXIS BECOMES INTERNAL X AXIS, + TO THE RIGHT ACROSS 8.5" WIDTH OF PAPER
REFERENCES TO X & Y IN CODE COMMENTS ARE TO INTERNAL COORDINATE SYSTEM
MINX IS THE DISTANCE FROM THE ORIGIN TO THE LEFT EDGE OF THE DRAWING
MAXX IS THE DISTANCE FROM THE ORIGIN TO THE RIGHT EDGE OF THE DRAWING
MINY IS THE DISTANCE FROM THE ORIGIN TO THE BOTTOM EDGE OF THE DRAWING
MAXY IS THE DISTANCE FROM THE ORIGIN TO THE TOP EDGE OF THE DRAWING
PEN-UP EXCURSIONS OFF THE EDGES OF THE PLOT BUFFER DON'T RAISE THE OUT OF
BOUNDS ALARM (I THINK)
⊗
BEG: JRST NORPG ;NORMAL STARTUP
SETOM RPGMOD ;RPG CALL, STORE THE GOODIES PASSED IN THE ACS
MOVEM 0,FILNAM
MOVEM 0,XGSNAM
HLLZM 1,FILEXT
HRLZM 1,XGSFLG#
MOVSI 1,'XG0'
MOVEM 1,XGSEXT
MOVEM 2,FILPPN
MOVEM 2,XGSPPN
MOVEM 3,RPGX#
MOVEM 4,RPGY#
MOVEM 5,LINE
OUTSTR[ASCIZ/WELCOME TO X! ;GREET THE LOSER IF HE'S WATCHING
/]
MOVE 1,['[PLX] ']
MOVE P,[IOWD LPDL,PDL]
PUSHJ P,DETCHK ;SEE IF WE'RE DETACHED
SETNAM 1, ;CHANGE TO IMPRESSIVE NAME IF WE ARE
RESET
HRRE A,RPGY ;GET OFFSET FROM ORIGIN TO LEFT EDGE OF PLOT
MOVN A,A ;CHANGE SENSE OF OFFSET TO "OFFSET FROM EDGE TO ORIGIN"
ADDI A,BOTTOM ;INCLUDE MARGIN
JRST YDEF1 ;SNEAK AROUND NORMAL ENTRY MODE STUFF
NORPG: SETZM RPGMOD# ;TELL WORLD THAT SOME POOR LOSER IS RUNNING US MANUALLY
SETOM LINE
GETLIN LINE ;FIND OUT WHO WE GET TO BITCH AT
MERGE: RESET
MOVE P,[IOWD LPDL,PDL] ;STACKS ARE FUN--EVEN MORE SO IF THEY'RE INITIALIZED
FILIN: OUTSTR [ASCIZ /FILE?/]
PUSHJ P,FRD ;FILL UP THE BLOCK AT FILNAM WITH GOOD STUFF
YAGAIN: OUTSTR [ASCIZ/
PLOT SLICE? (0 OR <CR> FOR SINGLE PAGE PLOTS) /] ;NICE HUMANE PROMPT
SETZ A, ;A ISN'T CLOBBERED IN RNUM IF <CR> IS TYPED SO CLEAR IT FIRST
PUSHJ P,RNUM ;WINNING HELLIWELL NUMBER SCANNER- AC 'A' CONTAINS DECIMAL
; CONVERSION OF FIRST DIGIT STRING FOUND, AC 'C' CONTAINS DELIMITER FOR THAT STRING,
; ("+" AND <CR> ARE FLUSHED), SIGN CONTAINS -1 IF STRING WAS PRECEEDED BY "-", 0
; OTHERWISE, AND SKIP RETURN IS TAKEN. IF NO STRING WAS TYPED, NORMAL RETURN
; IS TAKEN AND AC 'A' LEFT UNMOLESTED.
JRST YAGN1 ;<CR> WAS TYPED
JUMPL A,YAGAIN ;IDIOT TYPED NEGATIVE NUMBER
CAIE C,12 ;ANY GARBAGE AFTER NUMBER?
JRST YAGAIN ;YUP, FLUSH AND TRY AGAIN
IMULI A,WIDTH-OVERLAP ;CONVERT SLICE SPEC TO BIT COUNT REPRESENTING
;(NO. OF PAGE WIDTHS-TAPING OVERLAP PER PAGE)
YAGN1: ADDI A,BOTTOM ;INCLUDE 1/4" BOTTOM MARGIN
MOVE B,A ;SAVE X OFFSET
YAGN2: OUTSTR [ASCIZ/
ORIGIN Y OFFSET FROM BOTTOM (DEFAULT IS -1)? /]
PUSHJ P,RNUM ;W.H.N.S. AGAIN
JRST [ HRREI A,-=200 ;DEFAULT DIST. FROM EDGE TO ORIGIN
JRST YDEF]
IMULI A,=200 ;SCALE WHOLE NUMBER PART INTO STEPS
CAIE C,"." ;STRING DELIMITED BY DECIMAL POINT?
JRST YDEFP ;NO
INCHWL C ;SCANNER KLUDGE FOR TENTHS DIGIT
CAIN C,15
INCHWL C
CAIL C,"0"
CAILE C,"9"
JRST .+1
SUBI C,60
IMULI C,=20 ;SCALE TENTHS DIGIT INTO STEPS
SKIPE SIGN ;SIGN GETS SET IN RNUM IF "-" PRECEEDED NUMBER
MOVN C,C ;SO FIX SIGN OF FRACTION IF NECESSARY
ADD A,C ;INCORPORATE TENTHS DIGIT IN WHOLE NUMBER PORTION
PUSH P,A
PUSHJ P,RNUM ;GOBBLE REST OF FRACTIONAL PORTION
JFCL
POP P,A
YDEFP: CAIE C,12 ;ANY GARBAGE LEFT?
JRST [ CLRBFI ;YES, FLUSH AND DO IT AGAIN
JRST YAGN2]
YDEF: ADD A,B ;ADD SLICE OFFSET TO ORIGIN OFFSET
YDEF1: MOVEM A,INIX# ;STORE AS INITIAL X
HRRZS LINE ;CLEAR ALL BUT LINE # OF DESTINATION TTY FOR MESSAGES
AGAIN: MOVE A,[FILNAM,,LKENT]
BLT A,LKENT+3
OPEN DSK,[14↔'DSK '↔IBUF] ;OPEN INPUT CHANNEL
JRST 4,.
INBUF DSK,NBUFS ;SET UP BUFFER RING
LOOKUP DSK,LKENT ;LOOKUP .PLX FILE
JRST FNF ;LOSE-NOBODY HOME
ASKLEN: PUSHJ P,XINI ;IF XINI WINS, IT TAKES THE SKIP RETURN WITH ENOUGH
; CORE IN JOB SPACE FOR PLOT, AND THE FOLLOWING CELLS SET UP:
; (A,B,PEN,X,Y,&XD ARE AC'S, "Y→FOO" MEANS RIGHT HALF OF Y POINTS TO LOCATION FOO)
; "VIDEO WORD NUMBER 1" IS THE SECOND WORD IN ANY LINE BUFFER (FIRST IS GCW)
; IYPOS IS THE INDEX INTO THE PLOT BUFFER OF THE FIRST WORD OF THE LINE BUFFER
; REPRESENTING THE Y COORDINATE OF THE PLOT ORIGIN (NEG IF OFF TOP OF PAGE).
; B CONTAINS A ONE IN THE STARTING BIT POSITION OF THE ORIGIN VIDEO WORD
; U CONTAINS JOBREL
; PEN CONTAINS <CAIA BYTTAB>
; 1(L) IS THE ADDRESS OF THE FIRST WORD OF THE PLOT BUFFER (WHICH IN TURN IS
; THE GCW OF THE FIRST SCAN LINE)
; XD POINTS TO SECOND WORD OF DBUF
; Y → VIDEO WORD NO. 1 OF ORIGIN LINE BUFFER
; IF A=0 ORIGIN IS WITHIN X MARGINS, RHW(X)=ORIGIN VIDEO WORD NO., AND LHW(X)→Y
; IF A≠0 ORIGIN IS OFF PAGE, A+RHW(X)=ORIGIN VIDEO WORD NO., AND LHW(X)→XD
JRST CORLUZ ;IF XINI LOSES, COMPLAIN
OUTER: IN DSK, ;FILL BUFFERS FULL OF LOSING CALCOMP COMMANDS, 6 TO A WORD
JRST INOK ;WIN
STATO DSK,20000 ;EOF?
JRST 4,. ;NO, LOSE
RELEAS DSK, ;YES, DONE WITH PLX FILE
IFN LSTBIT-1,< MOVE A,[LSTBIT-1] ;FILL OUT LINE UNLESS LAST BIT OF LINE
MOVE C,LINCNT ;BUFFER IS ON A WORD BOUNDARY
HRRZ D,XGPPTR
XFIXL: ANDCAM A,LBUFL-1+2(D)
ADDI D,LBUFL+1
SOJG C,XFIXL
>;LSTBIT-1
JRST XGPOUT ;CRANK THE MOTHER
INOK: MOVN E,IBUF+2 ;GET -WORD COUNT
MOVSI E,(E) ;PUT IN LHW(E)
HRR E,IBUF+1 ;PUT POINTER TO CELL PRECEDING FIRST BUFFER WORD INTO RHW(E)
MAIN: MOVE C,1(E) ;GET A WORD
JFFO C,DOIT ;IF ITS GOT SOME BITS ON, FIND THE FIRST ONE AND INTERPRET
AOBJN E,MAIN ;IF NOT, GET ANOTHER WORD
JRST OUTER ;GET ANOTHER BUFFER FULL
DOIT: ANDCM C,BITTAB(D) ;MASK OUT BIT FOUND BY JFFO
XCT MOVI1(D)
XCT MOVI2(D)
DOI3: XCT MOVI3(D)
DOPEN: XCT PEN
IORM B,@X
DONXT: JFFO C,DOIT
AOBJN E,MAIN
JRST OUTER
MOVI1: REPEAT 6,{
HRLI PEN,(<CAIA>) ;PEN UP (40 BIT)
HRLI PEN,(<TDNN C,(D)>) ;PEN DOWN (20 BIT)
JUMPGE B,DOI3 ;DRUM DOWN (10 BIT)
ROT B,-1 ;DRUM UP ( 4 BIT)
SUBI Y,LBUFL+1 ;CARRIAGE LEFT ( 2 BIT)
ADDI Y,LBUFL+1 ;CARRIAGE RIGHT ( 1 BIT)
}
MOVI2: REPEAT 6,{
JRST DONXT
JRST DONXT
XCT XMOVL(X)
JUMPGE B,DOPEN
CAIGE Y,(L)
CAIL Y,-LBUFL-1(U)
}
MOVI3: REPEAT 6,{
JRST 4,.
JRST 4,.
ROT B,1
XCT XMOVR(X)
JRST LOSE
JRST LOSE
}
ADDI A,1
XMOVL: HRLOI X,XD
REPEAT LBUFL-1,<SUBI X,1>
SOJL A,.+1
MOVE X,[Y,,LBUFL-1]
AOJA A,DOI3
SOJL A,XONR
XMOVR: REPEAT LBUFL-1,<ADDI X,1>
MOVE X,[XD,,LBUFL]
ADDI A,1
XONR: MOVSI X,Y
AOJA A,DOPEN
XINI: SKIPE RPGMOD
JRST [ HLRE A,RPGX ;GET MAX X
HRRE B,RPGX ;AND MIN X
SUB A,B ;FIND DIF
ADDI A,=100 ;LEAVE 1/4 INCH MARGIN AT EACH END
SUBI B,=50 ;INCORPORATE 1/4 INCH INTO MIN X
IMULI B,LBUFL+1 ;MAKE IT WORDS IN MEMORY
MOVNM B,IYPOS# ;INITIAL Y POS. (REFERRED TO TOP EDGE)
JRST XDEF]
XINI1: OUTSTR [ASCIZ /TOTAL LENGTH IN INCHES (X DIMENSION, DEFAULT = 11)? /]
PUSHJ P,RNUM
MOVEI A,=11 ;GIVE HIM DEFAULT LENGTH
JUMPLE A,[ XINLER: CLRBFI ;IDIOT TYPED A NEGATIVE NUMBER
JRST XINI1]
CAIE C,12 ;ANY GARBAGE BEYOND NUMBER?
JRST XINLER ;YEAH, FLUSH & TRY AGAIN
IMULI A,=200 ;CHANGE INCHES TO XGP SCAN LINES
PUSH P,A ;SAVE THIS
YINI1: OUTSTR [ASCIZ \ORIGIN X OFFSET FROM LEFT END(DEFAULT IS 1/2 LENGTH)? \]
PUSHJ P,RNUM
JRST [ MOVE A,(P) ;DEFAULT--RESTORE LENGTH TO A
ASH A,-1 ;DIVIDE BY 2
IMULI A,LBUFL+1 ;CONVERT TO WORDS IN MEMORY
JRST IYDEF]
CAIE C,12 ;END OF STUFF?
JRST [ CLRBFI ;NO, FLUSH
JRST YINI1]
IMULI A,=200*(LBUFL+1) ;CONVERT FROM INCHES TO WORDS IN MEMORY
IYDEF: MOVEM A,IYPOS ;SAVE INITIAL Y OFFSET
POP P,A ;RESTORE TOTAL NUMBER OF SCAN LINES TO A
XDEF: MOVEM A,LINCNT# ;SAVE LINE COUNT
MOVEI B,-1(A) ;B←LINE COUNT - 1 (USED BELOW IN LOOP AT XINL)
IMULI A,LBUFL+1 ;A←TOTAL NUMBER OF WORDS NEEDED TO CONTAIN PLOT
MOVE T,JOBFF
MOVEM T,XGPPTR
SOS XGPPTR ;RHW(XGP POINTER) ← JOBFF - 1
MOVEI T,2(A) ;T←2+(LINE COUNT)*(LINE BUFFER LENGTH + 1)
MOVNI TT,(T) ;TT← - T
ADD T,XGPPTR ;T←2+LINCNT*(LBUFL+1)+JOBFF-1
HRLM TT,XGPPTR ;LHW(XGPPTR)← -(PLOT BUFFER + 2)
MOVE TT,T ;SAVE REQUIRED JOB SIZE IN TT
CORE T, ;BEG FOR CORE
POPJ P, ;LOSE
HRRZ L,XGPPTR ;L←OLD TOP OF WORLD
MOVSI T,1(L) ;LHW(T)← FIRST WORD OF PLOT BUFFER
HRRI T,2(L) ;RHW(T)← SECOND WORD OF PLOT BUFFER
SETZM 1(L) ;CLEAR OLD TOP OF WORLD + 1 (BOTTOM OF XGP BUFFER)
MOVE U,JOBREL ;PUT NEW TOP OF WORLD IN U
BLT T,(U) ;CLEAR THE PLOT BUFFER (AND REST OF CORE TO JOBREL)
MOVE TT,[BYTE (12)4001,LMAR,LBUFL] ;SET UP GCW
MOVEM TT,1(L) ;INSERT GCW FOR FIRST LINE (INCLUDES MARK&CUT)
TLZ TT,400000 ;DELETE MARK AND CUT FROM SUCCEEDING LINES
MOVEI T,1+LBUFL+1(L) ;T←ADDRESS OF START OF SECOND SCAN LINE
XINL: MOVEM TT,(T) ;STUFF MARKLESS AND CUTLESS COMMAND WHERE T POINTS
ADDI T,LBUFL+1 ;BUMP POINTER TO START OF NEXT SCAN LINE
SOJG B,XINL ;STUFF COMMAND IN FRONT OF EACH REMAINING LINE BUFFER
MOVSI TT,400100
MOVEM TT,(T) ;PUT MARK AND CUT COMMAND AT END OF LAST LINE
MOVE PEN,[CAIA BYTTAB] ;BYTTAB POINTS TO TABLE OF SIX SETS OF SIX
;WORDS CONTAINING 770000,,0 IN EACH WORD OF
;SET 1, 007700,,0 IN EACH WORD OF SET 2, ETC.
MOVE Y,IYPOS
ADDI Y,2(L) ;Y POINTS TO FIRST VIDEO WORD OF ORIGIN LINE BUFFER
MOVEI XD,DBUF+1 ;DBUF POINTS TO BUFFER OF LENGTH LBUFL+2
SKIPL A,INIX ;START INSIDE BORDER OR OUT?(INIX IS #GRID POINTS)
JRST MAYBON ;MAY BE ON PAPER
SUBI A,43 ;DEFINITELY OFF LEFT EDGE--FIGURE OUT HOW FAR IN WORDS
IDIV A,[-44]
HRLOI X,XD ;LHW(X)←ADDRESS OF XD, RHW(X)← -1
SOJA A,SETB ;A CONTAINS NO. OF WORD BOUNDARIES TO BE CROSSED
;TO REACH LEFT EDGE OF PAGE
MAYBON: ADDI A,43
IDIVI A,44 ;A←(INIX+35) MOD 36--THE WORD IN LBUF WHERE PLOTTING BEGINS
CAILE A,LBUFL ;ARE WE OFF THE RIGHT EDGE?
JRST OFFRT ;YUP
MOVE X,A ;NOPE, SAVE STARTING POINT IN X
SETZ A, ;CLEAR A BEFORE GOING TO SETB
HRLI X,Y ;LHW(X)←ADDRESS OF Y
JRST SETB
OFFRT: MOVE X,[XD,,LBUFL] ;LHW(X)←ADDRES OF XD, RHW(X)←LINE BUFFER LENGTH
SUBI A,LBUFL ;A NOW CONTAINS NUMBER OF WORDS BY WHICH ORIGIN IS
;OFF RIGHT END OF SCAN LINE, MINUS ONE LINE BUFFER LENGTH
SETB: MOVE B,INIX ;B← START (IN GRID POINTS)
IDIVI B,44 ;C←STARTING BIT NUMBER IN WORD
MOVSI B,400000
MOVN C,C
ROT B,(C) ;B NOW CONTAINS A ONE WHERE THE PLOT STARTS
POPJ1: AOS (P)
CPOPJ: POPJ P,
XGPOUT: SKIPGE XGSFLG
JRST [ OPEN XGP,[17↔'DSK '↔0]
JRST DSKERR
HLLZS XGSEXT
SETZM XGSEXT+1
MOVE A,XGSPPN
ENTER XGP,XGSNAM
JRST DSKERR
MOVEM A,XGSPPN
JRST OUTIT]
OPEN XGP,[1017↔'XGP '↔0]
JRST NOXGP
OUTSTR[ASCIZ/CRANKING XGP
/]
LOCK
OUTIT: OUT XGP,XGPPTR
JRST OUTOK
DSKERR: PUSHJ P,DETCHK
PUSHJ P,XERR
PUSHJ P,ERRPNT
ASCIZ /XGP OUTPUT ERROR.
/
OUTOK: UNLOCK
RELEAS XGP,
SKIPN RPGMOD
JRST XMORE
MOVSI A,1
ADDM A,XGSEXT ;SETUP FOR NEXT PART OF XG.. FILE
MOVN A,INIX
ADDI A,WIDTH-OVERLAP ;MAKE SURE WE CAN TAPE IT
HLRE B,RPGY ;GET MAX Y
SUBI B,OVERLAP ;ACCOUNT FOR OVERLAP IN A
CAMGE A,B ;HIGH ENOUGH YET?
JRST [ OUTSTR[ASCIZ/GOING BACK FOR ANOTHER PASS
/]
JRST YDEF] ;NO, MAKE ANOTHER PASS
XMORE: PUSHJ P,CORDWN ;REALLY DONE, CORE DOWN
PUSHJ P,DETCHK
JRST DODEL ;DELETE AUTOMATICALLY IF DETACHED
OUTSTR[ASCIZ/DELETE PLX FILE?/]
INCHRW C
CAIN C,15
INCHRW C
CAIE C,12
OUTSTR[ASCIZ/
/]
CAIE C,"Y"
CAIN C,"y"
CAIA
JRST NODEL
DODEL: MOVE A,[FILNAM,,LKENT]
BLT A,LKENT+3
INIT DSK,17
'DSK '
0
JRST [ SKIPGE DET
PUSHJ P,XERR
PUSHJ P,ERRPNT
ASCIZ/COULDN'T GET DISK FOR DELETE!
/
JRST NODEL]
LOOKUP DSK,LKENT
JRST [ SKIPGE DET
PUSHJ P,XERR
PUSHJ P,ERRPNT
ASCIZ/LOOKUP FOR DELETE FAILED!
/
JRST NODEL]
MOVE A,FILPPN
MOVEM A,LKENT+3
SETZM LKENT
RENAME DSK,LKENT
CAIA
JRST NODEL
SKIPGE DET
PUSHJ P,XERR
PUSHJ P,ERRPNT
ASCIZ/RENAME FOR DELETE FAILED!
/
NODEL: RELEASE DSK,
SKIPGE DET
PUSHJ P,XERR
PUSHJ P,ERRPNT
ASCIZ/ALL DONE!
/
EXIT ;LEAVE
NOXGP: PUSHJ P,DETCHK
PUSHJ P,XERR
PUSHJ P,ERRPNT
ASCIZ /XGP NOT AVAILABLE (I THOUGHT I WAS WAITING FOR IT)!
/
POPJ P,
XGPPTR: BLOCK 2
CORDWN: MOVE T,JOBFF
SUBI T,1
CORE T,
JRST 4,.
POPJ P,
FNF: PUSHJ P,DETCHK ;COULDN'T FIND THE FILE
PUSHJ P,XERR
PUSHJ P,ERRPNT
ASCIZ /LOOKUP FAILED.
/ ;COMPLAIN APPROPRIATELY
SKIPGE DET
EXIT ;QUIT IF WE'RE DETACHED
SETZM RPGMOD
JRST FILIN ;NOT DETACHED-TRY AGAIN
CORLUZ: MOVE T,TT ;NOT ENOUGH CORE-TELL HIM HOW MUCH WE'D LIKE
LSH T,-12
PUSH P,T
PUSHJ P,DETCHK
PUSHJ P,XERR
POP P,T
PUSHJ P,DECOUT
PUSHJ P,ERRPNT
ASCIZ / K OF CORE NEEDED!
/
SKIPGE DET
EXIT ;GIVE UP IF DETACHED
SETZM RPGMOD ;BE SLUGGISHLY INTERACTIVE IF WE'RE NOT
JRST ASKLEN
LOSE: PUSHJ P,DETCHK ;PLOT TOO BIG IN Y DIRECTION
PUSHJ P,XERR
PUSHJ P,ERRPNT
ASCIZ /POINT OUT OF BOUNDS, /
CAIGE Y,(L)
JRST [ PUSHJ P,ERRPNT
ASCIZ/-X/
JRST LOSE1]
PUSHJ P,ERRPNT
ASCIZ/+X/
LOSE1: PUSHJ P,ERRPNT
ASCIZ/, TRY AGAIN!
/
PUSHJ P,CORDWN
SKIPGE DET
EXIT
SETZM RPGMOD
JRST AGAIN
DECOUT: IDIVI T,=10
HRLM TT,(P)
SKIPE T
PUSHJ P,DECOUT
HLRZ TT,(P)
ADDI TT,60
ROT TT,-7
MOVEM TT,.+2
PUSHJ P,ERRPNT
0
POPJ P,
ERRPNT: HRRZ TT,(P)
MOVEM TT,PNTR
MOVEI TT,LINE
TTYMES TT,
JRST [ OUTSTR[ASCIZ/TTYMES FAILED /]
OUTSTR @PNTR
OUTSTR[ASCIZ/
/]
JRST .+1]
POP P,TT
HRL TT,(TT)
TLNE TT,376
AOJA TT,.-2
JRST 1(TT)
XERR: PUSHJ P,ERRPNT
ASCIZ/
MESSAGE FROM X WORKING ON /
MOVE TT,FILNAM
PUSHJ P,SIXOUT
PUSHJ P,ERRPNT
ASCIZ/./
HLLZ TT,FILEXT
PUSHJ P,SIXOUT
PUSHJ P,ERRPNT
ASCIZ/[/
MOVE TT,FILPPN
PUSHJ P,SIXOUT
PUSHJ P,ERRPNT
ASCIZ/] : /
POPJ P,
SIXOUT: JUMPE TT,CPOPJ
SETZ T,
LSHC T,6
ADDI T,40
PUSH P,TT
ROT T,-7
MOVEM T,.+2
PUSHJ P,ERRPNT
0
POP P,TT
JRST SIXOUT
DETCHK: SETOM DET#
GETLIN DET
HRRES DET
SKIPL DET
AOS (P)
POPJ P,
FRD: MOVSI A,'PLX'
MOVEM A,FILEXT
PUSHJ P,GETNAM
JUMPE A,.+2
MOVEM A,FILNAM
CAIE C,"."
JRST NOEXT
PUSHJ P,GETNAM
MOVEM A,FILEXT
NOEXT: CAIE C,"["
JRST FRDX
PUSHJ P,GETP
HRLZM A,FILPPN
PUSHJ P,GETP
HRRM A,FILPPN
FRDX: INCHRW C
CAIE C,12
JRST FRDX
POPJ P,
RNUM: INCHWL C
CAIN C,15
JRST RNUM
CAIN C,12
POPJ P,
AOS (P)
MOVEI A,
SETZM SIGN ;WINNING GAFFORD MOD TO WINNING HELLIWELL NUMBER SCANNER
CAIN C,"-"
JRST [ PUSHJ P,RNUML
SETOM SIGN
MOVN A,A
POPJ P,]
CAIN C,"+"
RNUML: INCHWL C
CAIL C,"0"
CAILE C,"9"
JRST RNUMX
IMULI A,12
ADDI A,-"0"(C)
JRST RNUML
RNUMX: CAIN C,15
INCHRW C
POPJ P,
GETNAM: MOVEI A,
MOVE B,[440600,,A]
GETNML: PUSHJ P,RCH
POPJ P,
SUBI C,40
TLNE B,770000
IDPB C,B
JRST GETNML
GETP: MOVEI A,
GETPL: PUSHJ P,RCH
POPJ P,
TRNE A,770000
JRST GETPL
LSH A,6
ADDI A,-40(C)
JRST GETPL
RCH: INCHWL C
CAIN C,42
JRST RCHQ
CAIE C,11
CAIN C," "
JRST RCH
CAIE C,"."
CAIN C,","
POPJ P,
CAIE C,"["
CAIN C,"]"
POPJ P,
RCHQR: CAIGE C,40
POPJ P,
CAIL C,"a"
CAILE C,"z"
CAIA
SUBI C,40
JRST POPJ1
RCHQ: INCHWL C
JRST RCHQR
FILNAM: 0
FILEXT: 0
0
FILPPN: 0
LKENT: BLOCK 4
XGSNAM: 0
XGSEXT: 0
0
XGSPPN: 0
IBUF: BLOCK 3
BITTAB: FOR I←43,0,-1{1⊗I
}
BYTTAB: FOR I←36,0,-6{REPEAT 6,{77⊗I}}
DBUF: BLOCK LBUFL+2
PDL: BLOCK LPDL
END BEG